#!/usr/bin/env python3
"""
数据库路径检查脚本
用于查找项目中所有可能的数据库文件，并验证应用程序使用的数据库路径
"""
import os
import sys
import sqlite3

# 获取项目根目录
base_dir = os.path.dirname(os.path.abspath(__file__))

print("=" * 60)
print("数据库路径检查工具")
print("=" * 60)
print(f"当前工作目录: {os.getcwd()}")
print(f"项目根目录: {base_dir}")

# 1. 查找所有可能的数据库文件
print("\n1. 查找项目中的所有SQLite数据库文件:")
db_files = []
for root, dirs, files in os.walk(base_dir):
    # 排除虚拟环境目录和git目录
    if 'venv' in dirs:
        dirs.remove('venv')
    if '.git' in dirs:
        dirs.remove('.git')
    
    for file in files:
        if file.endswith('.db'):
            file_path = os.path.join(root, file)
            rel_path = os.path.relpath(file_path, base_dir)
            file_size = os.path.getsize(file_path) / 1024  # KB
            db_files.append((rel_path, file_size))

if db_files:
    print(f"找到 {len(db_files)} 个数据库文件:")
    for rel_path, size in db_files:
        full_path = os.path.join(base_dir, rel_path)
        print(f"  - {rel_path} ({size:.2f} KB) [完整路径: {full_path}]")
else:
    print("未找到数据库文件")

# 2. 检查应用程序的数据库配置
print("\n2. 检查应用程序数据库配置:")
database_config_path = os.path.join(base_dir, "app", "core", "database.py")
if os.path.exists(database_config_path):
    print(f"找到数据库配置文件: {database_config_path}")
    # 尝试读取DATABASE_URL设置
    with open(database_config_path, 'r') as f:
        content = f.read()
        import re
        match = re.search(r'DATABASE_URL\s*=\s*["\'](.*?)["\']', content)
        if match:
            db_url = match.group(1)
            print(f"DATABASE_URL = {db_url}")
            # 解析SQLite路径
            if db_url.startswith('sqlite:///'):
                # 从sqlite:///./flowscape.db 提取 ./flowscape.db 部分
                sqlite_path = db_url[10:]  # 移除 'sqlite:///'
                # 转换为绝对路径
                abs_sqlite_path = os.path.normpath(os.path.join(base_dir, sqlite_path))
                print(f"解析后的SQLite路径: {sqlite_path}")
                print(f"绝对路径: {abs_sqlite_path}")
                print(f"文件存在: {os.path.exists(abs_sqlite_path)}")
                
                # 如果存在，连接并检查表结构
                if os.path.exists(abs_sqlite_path):
                    print("\n连接到配置的数据库并检查表结构:")
                    try:
                        conn = sqlite3.connect(abs_sqlite_path)
                        cursor = conn.cursor()
                        # 检查表是否存在
                        cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='file_uploads';")
                        table_exists = cursor.fetchone()
                        print(f"file_uploads表存在: {bool(table_exists)}")
                        
                        # 检查departure_retention_status列是否存在
                        if table_exists:
                            cursor.execute("PRAGMA table_info(file_uploads);")
                            columns = cursor.fetchall()
                            has_departure_column = any(col[1] == 'departure_retention_status' for col in columns)
                            print(f"departure_retention_status列存在: {has_departure_column}")
                            print(f"总列数: {len(columns)}")
                    except Exception as e:
                        print(f"检查数据库时出错: {e}")
                    finally:
                        conn.close()
        else:
            print("未找到DATABASE_URL设置")
else:
    print("未找到数据库配置文件")

# 3. 检查是否有环境变量覆盖了数据库配置
print("\n3. 检查环境变量:")
if 'DATABASE_URL' in os.environ:
    print(f"环境变量 DATABASE_URL = {os.environ['DATABASE_URL']}")
else:
    print("环境变量 DATABASE_URL 未设置")

# 4. 提供诊断报告
print("\n=" * 30)
print("诊断报告")
print("=" * 60)

if len(db_files) > 1:
    print("⚠️  警告: 发现多个数据库文件，这可能导致混淆")
    print("   请确保应用程序连接到正确的数据库文件")

# 检查默认数据库文件的路径问题
default_db_path = os.path.join(base_dir, "flowscape.db")
if not os.path.exists(default_db_path) and db_files:
    print("⚠️  警告: 默认路径下的数据库文件不存在")
    print("   应用程序可能连接到了不同的数据库文件")

print("\n建议:")
print("1. 确保应用程序和调试工具使用相同的数据库文件")
print("2. 确认DATABASE_URL配置正确指向预期的数据库文件")
print("3. 如果问题仍然存在，可以尝试删除数据库文件并重新运行迁移脚本")
print("   注意: 这将清除所有现有数据！")
print("=" * 60)